import { t } from 'i18next'
import createVanilla from 'zustand/vanilla'
import { subscribeWithSelector } from 'zustand/middleware'
import create from 'zustand'
import { IMccOperation } from '@/api/personalConfig/interface'
import { getUrlParams } from '@/utils'

export type IPage = 'mcc_main' | keyof IMccOperation | 'mt_camera' | 'mt_info'
export type StateStore = {
	/** 会议信息 */
	mccInfo: {
		/** 创建者信息 */
		createBy: {
			moid: string //getMeetingInfo里的account只会是moid
			name: string
		}
		/** 量子加密 0-关闭 1-开启 */
		quantumEncryption: 0 | 1
		/** 加密类型 0-不加密 2-AES加密 3-国密加密SM4 4-SM1 */
		encryptionType: 0 | 2 | 3 | 4
		/** 预占资源模式 0-关闭, 1-开启, 2-纯转发会议 */
		preoccupy_resource: 0 | 1 | 2
		/** 会议规模 */
		meetingResourceVO: {
			/** 会议规模 id */
			id: number
			/** 会议规模名 */
			name: string
			multi: number
		}
		/** 会议名称 */
		subject: string
		/** 会议种类 0-普通会议 1-调度会议 */
		meetingCategory: 0 | 1
		/** 会议类型 0-传统 1-端口 2-sfu 3-混合 */
		meetingType: 0 | 1 | 2
		/** 是否允许上传  0-不支持， 1-支持 */
		isUpload: 0 | 1
		/** 是否超大方会议  0-不是， 1-是 */
		superMtNum: 0 | 1
		/** 会议唯一性标志 meetingMoid */
		meetingMoid: string
		/** 会议密级 0-未定义 1-公开 2-内部 3-秘密 4-机密 */
		securityLevel: 0 | 1 | 2 | 3 | 4
		/**是否开启语音激励 */
		voiceInspireState: 0 | 1
		/**语音激励敏感度(s)，最小值3s, 开启语音激励时有效 */
		voiceInspireTime: number
		/** e164号*/
		e164: string
		/**会议开始时间 */
		startTime: string
		/**会议时长。0：代表永久会议 */
		duration: number
		/** 主流视频格式，默认为3
            1-MPEG;
            2-H.261;
            3-H.263;
            4-H.264_HP;
            5-H.264_BP;
            6-H.265;
            7-H.263+;
        */
		mediaFormat: number
		/** h264属性 1-HP; 0-BP; */
		mediaH264: number
		/**会议码率 */
		meetingRate: number
		/** 主流视频分辨率，默认为13
            1-QCIF;
            2-CIF;
            3-4CIF;
            12-720P;
            13-1080P;
            14-WCIF;
            15-W4CIF;
            16-4k;
        */
		meetingResolution: 1 | 2 | 3 | 12 | 13 | 14 | 15 | 16
		/** 主流帧率 */
		frame: number
		/** 会议密码 */
		password: string
		/** 会议免打扰  0 关闭 1 开启*/
		meetingClosed: 0 | 1
		/** 会议不可见 0 公开会议 1 隐藏会议*/
		meetingSafe: 0 | 1
		/** 水印 0 不开启 1 开启*/
		watermark: 0 | 1
		/**  是否允许RTC接入 0关闭*/
		enableRtc: 0 | 1
		/** 免登陆 0 不允许 */
		allowAnonymousMt: 0 | 1
		/** 双流权限 0-发言会场; 1-任意会场; 2-指定会场;*/
		doubleFlowLimit: 0 | 1 | 2
		/**智能级联的标识符*/
		smartCascadeMode: 0 | 1
		/**强制广播 */
		force_brd: 0 | 1
		/**禁止终端侧解除哑音 */
		force_mute: 0 | 1
		/**管理方画面合成 */
		chairman_mt_vmp_state: 0 | 1
		/**画面合成 */
		vmp_state: 0 | 1
		/**全场哑音 */
		mute: 0 | 1
		/**全场静音 */
		silence: 0 | 1
		/**画面合成是否开启 */
		vmpState: 0 | 1
		/**管理方画面合成是否开启 */
		chairmanMtVmpState: 0 | 1
	}
	enableJdb: 0 | 1
	/** 混音模式 1-智能混音，2-定制混音 0-没有 */
	mixMode: 0 | 1 | 2
	/** 超大方会议，限制解放（拖拽，添加等） */
	// emancipateLimit: boolean
	/** 是否是会议管理员或者创建者 */
	isMeetingAdminOrCreator: boolean
	/**当前tag页 */
	curPage: IPage
	/** 左右侧分割是否收缩 true: 展开  false 收缩*/
	collapsed: boolean
}
type IStore = StateStore & {
	update: (d: Partial<StateStore>) => void
	reset: () => void
	setCurPage: (page: IPage) => void
}
const initialState: StateStore = {
	mccInfo: {
		meetingMoid: getUrlParams('meetingMoid') ?? '',
		createBy: {
			moid: '',
			name: '',
		},
		quantumEncryption: 0,
		encryptionType: 0,
		meetingResourceVO: {
			id: 9,
			name: t('192方'),
			multi: 192,
		},
		preoccupy_resource: 0,
		subject: '',
		meetingCategory: 0,
		meetingType: 1,
		isUpload: 0,
		superMtNum: 0,
		securityLevel: 0,
		voiceInspireState: 0,
		voiceInspireTime: 3,
		e164: '',
		startTime: '',
		duration: 0,
		mediaFormat: 3,
		mediaH264: 0,
		meetingRate: 2048,
		meetingResolution: 13,
		frame: 30,
		password: '',
		meetingClosed: 0,
		meetingSafe: 0,
		watermark: 0,
		enableRtc: 0,
		allowAnonymousMt: 0,
		doubleFlowLimit: 0,
		smartCascadeMode: 0,
		force_brd: 0,
		chairman_mt_vmp_state: 0,
		vmp_state: 0,
		mute: 0,
		silence: 0,
		vmpState: 0,
		chairmanMtVmpState: 0,
		force_mute: 0,
	},
	enableJdb: 0,
	mixMode: 0,
	isMeetingAdminOrCreator: true,
	curPage: 'mcc_main',
	collapsed: true,
}
export const store = createVanilla<IStore>()(
	subscribeWithSelector((set, get) => ({
		...initialState,
		update: (d) => set({ ...d }),
		reset: () => set(initialState),
		setCurPage: (page) => {
			set({ curPage: page })
		},
	}))
)
export const useMccStore = create(store)
